/* 
 * File:   tree.h
 * Author: shaman
 *
 * Created on 26 Февраль 2009 г., 17:54
 *
 *  Модуль реализует сруктуру хеш дерева. На базе данной структуры затем будут реализованы
 * функции lock, unlock, wait, signal в библиотеке thread.h
 */

#ifndef _TREE_H
#define	_TREE_H

#include <malloc.h>
#include <memory.h>
//////////////////////////////////////////////////////////////////////////////////////////
typedef unsigned int uint;

typedef struct _Tree {
    void* Owner;                //Указатель на владельца регистрации (кто зарегистрировал)
    struct _Tree* SubTree[10];  //Поддеревья
    struct _Tree* Root;         //Корень для текущего поддерева
} Tree;

typedef Tree* LPTree;

//////////////////////////////////////////////////////////////////////////////////////////

/*=======================================================================================
 *desc:
 *  Функция инициализирует корень дерева.
 *return
 *  Вернёт указатель на созданный корень дерева. 0 - в случае ошибки.
 */
LPTree tree_create();

/*=======================================================================================
 * desc:
 *  функция добавления нового узла в дерево 
 *params:
 *  root - указатель на корень дерева
 *  value - добавляемое значение
 *  owner - владелец значения (должно быть не = 0)
 *return:
 *  Константы возвращаемые в качетсве результата метода add;
 */
#define TA_OK 0
#define TA_YOUR_REG 1
#define TA_NOT_YOUR_REG -1

int tree_add(LPTree root, uint value, void* Owner);

/*=======================================================================================
 *desc:
 *  функция удаления узла из дерева
 *params:
 *  root -
 *  value -
 *  Owner -
 *return:
 *  1 - узел не существовал
 *  0 - узел успешно удалён
 */

int tree_del(LPTree root, uint value, void* Owner);

/*=======================================================================================
 *desc:
 *  Проверка наличия узла в дереве
 *
 *param:
 *  root  - дерево в котором производится поиск
 *  value - значение для поиска
 *  Owner - обладатель данного значения
 *
 *return:
 *  0 - узел не найден
 *  1 - узел найден и узел зарегистрирован за текущим обладателем
 *  2 - узел найден, но закреплён за другим обладателем
 */

int tree_check(LPTree root, uint value, void* Owner);

#endif	/* _TREE_H */

